home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 22
/
Amiga Format AFCD22 (Jan 1998, Issue 106).iso
/
-in_the_mag-
/
converters
/
graphics
/
netpbm
/
source1
/
pbm
/
pbmtobbnbg.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-11-16
|
3KB
|
153 lines
/* pbmtobg.c - read a portable bitmap and produce BitGraph graphics
**
** Copyright 1989 by Mike Parker.
**
** Permission to use, copy, modify, and distribute this software and its
** documentation for any purpose and without fee is hereby granted, provided
** that the above copyright notice appear in all copies and that both that
** copyright notice and this permission notice appear in supporting
** documentation. This software is provided "as is" without express or
** implied warranty.
*/
/*
** Changed to take advantage of negative Packed Pixed Data values and
** supply ANSI-standard string terminator. Paul Milazzo, 28 May 1990.
*/
#include "pbm.h"
static void write16 ARGS(( unsigned int ));
static int nco;
int
main(argc,argv)
int argc;
char **argv;
{
int rows;
int cols;
int format;
bit *bitrow;
int row;
unsigned int sixteen;
int i;
unsigned int mask;
int op;
int x;
int y;
pbm_init( &argc, argv );
op = 3;
switch (argc)
{ case 1:
break;
case 2:
op = atoi(argv[1]);
break;
case 3:
x = atoi(argv[1]);
y = atoi(argv[2]);
printf("\33:%d;%dm",x,y);
break;
case 4:
op = atoi(argv[1]);
x = atoi(argv[2]);
y = atoi(argv[3]);
printf("\33:%d;%dm",x,y);
break;
}
nco = 0;
pbm_readpbminit(stdin,&cols,&rows,&format);
printf("\33P:%d;%d;%ds\n",op,cols,rows);
bitrow = pbm_allocrow(cols);
for (row=0;row<rows;row++)
{ pbm_readpbmrow(stdin,bitrow,cols,format);
sixteen = 0;
mask = 0x8000;
for (i=0;i<cols;i++)
{ if (bitrow[i]==PBM_BLACK) sixteen |= mask;
mask >>= 1;
if (mask == 0)
{ mask = 0x8000;
write16(sixteen);
sixteen = 0;
}
}
if (mask != 0x8000)
{ write16(sixteen);
}
}
puts("\033\\");
exit(0);
}
#ifdef POSITIVE_VALUES_ONLY
static void
write16(sixteen)
unsigned int sixteen;
{
if (nco > 75)
{ putchar('\n');
nco = 0;
}
if (sixteen & 0xfc00)
{ putchar(0100+(sixteen>>10));
nco ++;
}
if (sixteen & 0xfff0)
{ putchar(0100+((sixteen>>4)&0x3f));
nco ++;
}
putchar(060+(sixteen&0xf));
nco ++;
}
#else
/*
* This version of "write16" uses negative Packed Pixel Data values to
* represent numbers in the range 0x7fff--0xffff; negative values will
* require fewer characters as they approach the upper end of that range.
*/
static void
write16 (word)
unsigned int word;
{
int high;
int mid;
int low;
int signChar;
if (nco > 75) {
putchar ('\n');
nco = 0;
}
if (word > 0x7fff) {
word = (unsigned int) (0x10000L - (long) word);
signChar = ' ';
}
else
signChar = '0';
high = (word >> 10) + '@';
mid = ((word & 0x3f0) >> 4) + '@';
low = (word & 0xf) + signChar;
if (high != '@') {
printf ("%c%c%c", high, mid, low);
nco += 3;
}
else if (mid != '@') {
printf ("%c%c", mid, low);
nco += 2;
}
else {
putchar (low);
nco++;
}
}
#endif